using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._3DAnalystTools._TriangulatedSurface
{
    /// <summary>
    /// <para>Surface Slope</para>
    /// <para>Creates polygon features that represent ranges of slope values for triangulated surfaces.</para>
    /// <para>创建表示三角化曲面的坡度范围的面要素。</para>
    /// </summary>    
    [DisplayName("Surface Slope")]
    public class SurfaceSlope : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public SurfaceSlope()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_surface">
        /// <para>Input Surface</para>
        /// <para>The TIN, terrain, or LAS dataset whose slope measurements will be written to the output polygon feature.</para>
        /// <para>TIN、terrain 或 LAS 数据集，其坡度测量值将写入输出面要素。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// </param>
        public SurfaceSlope(object _in_surface, object _out_feature_class)
        {
            this._in_surface = _in_surface;
            this._out_feature_class = _out_feature_class;
        }
        public override string ToolboxName => "3D Analyst Tools";

        public override string ToolName => "Surface Slope";

        public override string CallName => "3d.SurfaceSlope";

        public override List<string> AcceptEnvironments => ["XYDomain", "XYResolution", "XYTolerance", "autoCommit", "configKeyword", "extent", "geographicTransformations", "outputCoordinateSystem", "scratchWorkspace", "terrainMemoryUsage", "workspace"];

        public override object[] ParameterInfo => [_in_surface, _out_feature_class, _units.GetGPValue(), _class_breaks_table, _slope_field, _z_factor, _pyramid_level_resolution];

        /// <summary>
        /// <para>Input Surface</para>
        /// <para>The TIN, terrain, or LAS dataset whose slope measurements will be written to the output polygon feature.</para>
        /// <para>TIN、terrain 或 LAS 数据集，其坡度测量值将写入输出面要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Surface")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_surface { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class that will be produced.</para>
        /// <para>将生成的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Slope Units</para>
        /// <para><xdoc>
        ///   <para>The units of measure to be used in calculating slope.</para>
        ///   <bulletList>
        ///     <bullet_item>Percent—Slope is expressed as a percentage value. This is the default.</bullet_item><para/>
        ///     <bullet_item>Degree—Slope is expressed as the angle of inclination from a horizontal plane.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>用于计算坡度的测量单位。</para>
        ///   <bulletList>
        ///     <bullet_item>百分比 - 斜率以百分比值表示。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>度 （Degree） - 坡度 （Slope） 表示为与水平面的倾斜角。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Slope Units")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _units_value _units { get; set; } = _units_value._PERCENT;

        public enum _units_value
        {
            /// <summary>
            /// <para>Percent</para>
            /// <para>Percent—Slope is expressed as a percentage value. This is the default.</para>
            /// <para>百分比 - 斜率以百分比值表示。这是默认设置。</para>
            /// </summary>
            [Description("Percent")]
            [GPEnumValue("PERCENT")]
            _PERCENT,

            /// <summary>
            /// <para>Degree</para>
            /// <para>Degree—Slope is expressed as the angle of inclination from a horizontal plane.</para>
            /// <para>度 （Degree） - 坡度 （Slope） 表示为与水平面的倾斜角。</para>
            /// </summary>
            [Description("Degree")]
            [GPEnumValue("DEGREE")]
            _DEGREE,

        }

        /// <summary>
        /// <para>Class Breaks Table</para>
        /// <para>A table containing classification breaks that will be used to group the output features. The first column of this table will indicate the break point, whereas the second will provide the classification code.</para>
        /// <para>包含分类中断的表，将用于对输出要素进行分组。此表的第一列将指示断点，而第二列将提供分类代码。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Class Breaks Table")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _class_breaks_table { get; set; } = null;


        /// <summary>
        /// <para>Slope Field</para>
        /// <para>The field containing slope values.</para>
        /// <para>包含斜率值的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Slope Field")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _slope_field { get; set; } = null;


        /// <summary>
        /// <para>Z Factor</para>
        /// <para>The factor by which z-values will be multiplied. This is typically used to convert z linear units to match x,y linear units. The default is 1, which leaves elevation values unchanged. This parameter is not available if the spatial reference of the input surface has a z datum with a specified linear unit.</para>
        /// <para>z 值将乘以的因子。这通常用于转换 z 线性单位以匹配 x，y 线性单位。默认值为 1，使高程值保持不变。如果输入曲面的空间参考具有具有指定线性单位的 z 基准面，则此参数不可用。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Z Factor")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _z_factor { get; set; } = 1;


        /// <summary>
        /// <para>Pyramid Level Resolution</para>
        /// <para>The z-tolerance or window-size resolution of the terrain pyramid level that will be used. The default is 0, or full resolution.</para>
        /// <para>将使用的地形金字塔级别的 z 容差或窗口大小分辨率。默认值为 0，即全分辨率。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Pyramid Level Resolution")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _pyramid_level_resolution { get; set; } = 0;


        public SurfaceSlope SetEnv(object XYDomain = null, object XYResolution = null, object XYTolerance = null, int? autoCommit = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object outputCoordinateSystem = null, object scratchWorkspace = null, object terrainMemoryUsage = null, object workspace = null)
        {
            base.SetEnv(XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, autoCommit: autoCommit, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, terrainMemoryUsage: terrainMemoryUsage, workspace: workspace);
            return this;
        }

    }

}